package com.woniuxy.rabbitmq.baseapi.mq06msgproperties;

/**
 * description: Producer <br>
 * date: 2022/1/10 5:05 下午 <br>
 * author: shesaifei <br>
 * version: 1.0 <br>
 */


import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.concurrent.TimeoutException;

/**
 * 消费者发送消息
 */
public interface Producer {

    public static void main(String[] args) throws IOException, TimeoutException {
        //连接工厂：配置连接参数，创建连接对象
        ConnectionFactory connectionFactory = new ConnectionFactory();
        connectionFactory.setHost("192.168.13.28");
        //connectionFactory.setHost("127.0.0.1");
        //设置虚拟机主机：类似于mysql数据库服务器中的一个具体数据库
        connectionFactory.setVirtualHost("/");
        //消息通信端口
        connectionFactory.setPort(5672);
        connectionFactory.setUsername("guest");
        connectionFactory.setPassword("guest");
        //连接对象
        Connection connection = connectionFactory.newConnection();
        //连接信道
        Channel channel = connection.createChannel();

        /**
         * 路由key:"",定义了队列以后，将队列绑定到交换机，消息进入交换机以后，向绑定的队列中发送相同的消息
         * String exchange: 交换机，simplest模式使用的默认交换机(交换 - 将消息发布到的交换)
         * String routingKey: 路由key：生成的消息先进入交换机，交换机根据路由的规则，将消息投递到指定的队列(simplest模式routingkey就是队列的名字)
         * boolean mandatory,
         * BasicProperties props: 消息属性(消息属性)
         * byte[] body:消息体，消息内容
         * 发送消息
         * 扇出模式：定义交换机,
         */
        //设置消息属性
        HashMap<String, Object> header = new HashMap<>();
        header.put("h1", "v1");
        header.put("h2", "v2");
        AMQP.BasicProperties props = new AMQP.BasicProperties().builder()
                //设置持久化:默认值1 重启服务器，消息丢失；2持久化
                .deliveryMode(2)
                //设置编码格式
                .contentEncoding("utf-8")
                /**
                 * 设置消息有效时间,指定的时间内没有消费消息
                 *    如果没有死行队列：自动删除，消息丢了
                 *    如果有死刑队列：进入死刑队列
                 */
                .expiration("10000")
                //添加消息头信息
                .headers(header)
                .build();
        channel.basicPublish("exchangetopic", "email", props, "email1".getBytes(StandardCharsets.UTF_8));
        channel.basicPublish("exchangetopic", "email", props, "email2".getBytes(StandardCharsets.UTF_8));
//        channel.basicPublish("exchangetopic", "email", null, "email3".getBytes(StandardCharsets.UTF_8));
//        channel.basicPublish("exchangetopic", "email", null, "email4".getBytes(StandardCharsets.UTF_8));
        System.out.println("发送成功");
        //关闭资源
        channel.close();
        connection.close();
    }
}
